iT邦幫忙

2024 iThome 鐵人賽

DAY 30
0
Kubernetes

K8s 資料庫管理系統系列 第 30

day 30 k8s分析社群軟體threads進而分析族群愛好資料庫管理系統

  • 分享至 

  • xImage
  •  

今天是第三十天我們可以寫一個k8s資料庫管理系統,謝謝iT邦幫忙給我這次30天學習k8s新程式語言的機會,讓我能30天不中斷的持續學習,讓我能熟知k8s是可以去如何去部署的並且做好資料庫的管理,以下是我的程式碼

  1. 資料收集服務:這個服務將會從 Threads 或其他社群平台抓取數據(例如貼文、用戶資料),並且將這些資料放入資料庫中。

  2. 資料分析服務:一個用來分析資料的微服務,可以利用自然語言處理 (NLP) 技術來分析用戶的喜好。

  3. 資料庫管理系統:用來儲存和管理這些分析結果,並且提供 API 來查詢。

  4. 前端界面:使用者可以通過一個簡單的前端介面來查詢族群愛好,顯示分析結果。

步驟 1: 部署 MongoDB 資料庫 (或其他合適的 DBMS)

首先,我們在 Kubernetes 中部署一個 MongoDB 資料庫來儲存收集到的 Threads 資料。

建立一個 MongoDB 部署文件 (mongodb-deployment.yaml):

apiVersion: apps/v1
kind: Deployment
metadata:
  name: mongodb
spec:
  replicas: 1
  selector:
    matchLabels:
      app: mongodb
  template:
    metadata:
      labels:
        app: mongodb
    spec:
      containers:
      - name: mongodb
        image: mongo:latest
        ports:
        - containerPort: 27017
        volumeMounts:
        - name: mongodb-storage
          mountPath: /data/db
      volumes:
      - name: mongodb-storage
        persistentVolumeClaim:
          claimName: mongodb-pvc
---
apiVersion: v1
kind: Service
metadata:
  name: mongodb
spec:
  ports:
  - port: 27017
    targetPort: 27017
  selector:
    app: mongodb

接著,為 MongoDB 創建一個 PVC(Persistent Volume Claim)來確保資料的持久性:

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: mongodb-pvc
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 1Gi

步驟 2: 部署資料收集微服務

這個微服務將通過 API 抓取 Threads 資料並存入 MongoDB。我們可以使用 Python 和 Flask 實現,並將它包裝成 Docker 映像檔。

data-collector.py 範例代碼:

from flask import Flask, request, jsonify
from pymongo import MongoClient
import requests

app = Flask(__name__)

client = MongoClient("mongodb://mongodb:27017/")
db = client['threads']
collection = db['posts']

# 從 Threads API 抓取資料並存入 MongoDB
@app.route('/collect', methods=['POST'])
def collect_data():
    # 模擬 Threads API 資料獲取
    response = requests.get('https://api.threads.com/posts')
    if response.status_code == 200:
        data = response.json()
        collection.insert_many(data)
        return jsonify({"status": "success"}), 200
    else:
        return jsonify({"status": "error"}), 500

if __name__ == '__main__':
    app.run(host='0.0.0.0', port=5000)

建立一個 Dockerfile

Dockerfile
FROM python:3.9-slim

WORKDIR /app

COPY requirements.txt requirements.txt
RUN pip install -r requirements.txt

COPY . .

CMD ["python", "data-collector.py"]

requirements.txt

Flask==2.1.1
pymongo==3.12.1
requests==2.26.0

將此微服務部署到 Kubernetes (data-collector-deployment.yaml):

apiVersion: apps/v1
kind: Deployment
metadata:
  name: data-collector
spec:
  replicas: 1
  selector:
    matchLabels:
      app: data-collector
  template:
    metadata:
      labels:
        app: data-collector
    spec:
      containers:
      - name: data-collector
        image: your-docker-image  # 使用您推送到 Docker registry 的映像
        ports:
        - containerPort: 5000
---
apiVersion: v1
kind: Service
metadata:
  name: data-collector
spec:
  ports:
  - port: 5000
    targetPort: 5000
  selector:
    app: data-collector

步驟 3: 部署資料分析微服務

這個微服務會從 MongoDB 中提取數據,進行 NLP 分析,並輸出分析結果。

data-analyzer.py 範例代碼:

from flask import Flask, jsonify
from pymongo import MongoClient
from textblob import TextBlob

app = Flask(__name__)

client = MongoClient("mongodb://mongodb:27017/")
db = client['threads']
collection = db['posts']

# 分析 Threads 貼文的情感
@app.route('/analyze', methods=['GET'])
def analyze_data():
    posts = collection.find({})
    result = []
    for post in posts:
        text = post.get('text', '')
        analysis = TextBlob(text).sentiment
        result.append({
            'post': text,
            'sentiment': analysis.polarity
        })
    return jsonify(result), 200

if __name__ == '__main__':
    app.run(host='0.0.0.0', port=5001)

當然,我將逐步解釋每一段程式碼,讓你了解它們的作用和如何運行。

1. MongoDB 部署 (mongodb-deployment.yaml)

這段 YAML 文件用來在 Kubernetes 集群中部署一個 MongoDB 服務,提供資料儲存功能。

部署部分:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: mongodb
spec:
  replicas: 1
  selector:
    matchLabels:
      app: mongodb
  template:
    metadata:
      labels:
        app: mongodb
    spec:
      containers:
      - name: mongodb
        image: mongo:latest
        ports:
        - containerPort: 27017
        volumeMounts:
        - name: mongodb-storage
          mountPath: /data/db
      volumes:
      - name: mongodb-storage
        persistentVolumeClaim:
          claimName: mongodb-pvc
  • apiVersion: apps/v1kind: Deployment:這表示 Kubernetes 將部署一個 MongoDB 實例。Deployment 是一種控制器,管理 MongoDB 實例的生命週期。
  • replicas: 1:這表示我們只部署一個 MongoDB 副本。可以根據需求擴展副本數。
  • image: mongo:latest:告訴 Kubernetes 使用最新版本的 MongoDB 映像檔來創建容器。
  • containerPort: 27017:這是 MongoDB 預設使用的端口,對應容器內的服務。
  • volumeMountsvolumes:這部分是將 MongoDB 的資料儲存在容器外部(persistent volume),保證數據的持久性。mongodb-pvc 是稍後定義的存儲卷聲明。

PVC 部分:

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: mongodb-pvc
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 1Gi
  • PersistentVolumeClaim (PVC):這用來向 Kubernetes 請求 1GiB 的存儲空間,供 MongoDB 使用。它確保資料不會因為 MongoDB 容器被刪除而丟失。

2. 資料收集微服務 (data-collector.py)

這段程式碼用來從 Threads 平台抓取數據,並將這些數據存入 MongoDB。

from flask import Flask, request, jsonify
from pymongo import MongoClient
import requests

app = Flask(__name__)

client = MongoClient("mongodb://mongodb:27017/")
db = client['threads']
collection = db['posts']
  • Flask:用來建立簡單的 HTTP 伺服器,我們可以通過它來接收請求,並返回結果。
  • MongoClient:這是用來連接到 MongoDB 資料庫的客戶端。這裡指定了 MongoDB 的連接字串 mongodb://mongodb:27017/,這與我們之前部署的 MongoDB 服務相連。
  • dbcollectiondb 是 MongoDB 的資料庫名稱,我們叫它 threadscollection 是資料庫中的一個集合,用來儲存 Threads 的資料。

收集資料的路由:

@app.route('/collect', methods=['POST'])
def collect_data():
    # 模擬 Threads API 資料獲取
    response = requests.get('https://api.threads.com/posts')
    if response.status_code == 200:
        data = response.json()
        collection.insert_many(data)
        return jsonify({"status": "success"}), 200
    else:
        return jsonify({"status": "error"}), 500
  • /collect 路由:當收到 POST 請求時,這個端點會執行一個函數去模擬調用 Threads 的 API (requests.get),來獲取資料(假設 URL 為 https://api.threads.com/posts)。

  • collection.insert_many(data):一旦成功獲取資料,我們將使用 insert_many 方法將所有資料插入到 MongoDB 集合中。

  • 最後,根據成功或失敗,返回 JSON 格式的回應,包含狀態訊息。


3. 資料分析微服務 (data-analyzer.py)

這段程式碼負責對 MongoDB 中的數據進行分析(如情感分析)。

from flask import Flask, jsonify
from pymongo import MongoClient
from textblob import TextBlob

app = Flask(__name__)

client = MongoClient("mongodb://mongodb:27017/")
db = client['threads']
collection = db['posts']
  • TextBlob:這是用來進行簡單情感分析的 Python 套件。它可以用來評估文字的情感極性。
  • 連接 MongoDB 的部分與前面的資料收集服務類似。

分析資料的路由:

@app.route('/analyze', methods=['GET'])
def analyze_data():
    posts = collection.find({})
    result = []
    for post in posts:
        text = post.get('text', '')
        analysis = TextBlob(text).sentiment
        result.append({
            'post': text,
            'sentiment': analysis.polarity
        })
    return jsonify(result), 200
  • /analyze 路由:當接收到 GET 請求時,這個端點會查詢 MongoDB 中所有貼文 (collection.find({}))。
  • TextBlob(text).sentiment:對每篇貼文進行情感分析,polarity 屬性範圍為 -1 到 1,分別代表負面和正面情感。
  • 最後將貼文和情感極性一起返回。

4. 資料庫與服務部署 (data-collector-deployment.yaml)

這個文件用來在 Kubernetes 上部署我們的資料收集微服務。

apiVersion: apps/v1
kind: Deployment
metadata:
  name: data-collector
spec:
  replicas: 1
  selector:
    matchLabels:
      app: data-collector
  template:
    metadata:
      labels:
        app: data-collector
    spec:
      containers:
      - name: data-collector
        image: your-docker-image  # 使用您推送到 Docker registry 的映像
        ports:
        - containerPort: 5000
---
apiVersion: v1
kind: Service
metadata:
  name: data-collector
spec:
  ports:
  - port: 5000
    targetPort: 5000
  selector:
    app: data-collector
  • replicas: 1:部署一個副本的資料收集微服務。
  • image:這裡需要指定你已推送到 Docker registry 的映像檔,這是微服務運行所需的環境。
  • Service:提供一個內部網絡的方式來訪問該服務,映射至 5000 端口,這與 Flask 伺服器的端口相對應。

這些部分構成了一個完整的社群資料分析系統。首先,我們部署 MongoDB 來儲存數據,然後通過資料收集微服務從 Threads 收集數據,並使用資料分析微服務對數據進行情感分析,最終可以在前端顯示這些結果。這個系統可以擴展,用於其他不同的數據分析場景。

最後這次真的非常謝謝iT邦幫忙能給我這次機會去做新的程式語言的學習,最重要的是能夠運用在自己活當中,因此這次的鐵人賽非常希望能得名,謝謝iT邦幫忙!


上一篇
day 29 K8s串接line bot分析颱風影響資料庫管理系統
系列文
K8s 資料庫管理系統30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言